// 1. 设计Animal抽象类
abstract class Animal {
    // 抽象方法eat
    public abstract void eat();
}

// 3. 定义Afraid接口
interface Afraid {
    void escape();
    void makeSounds();
}

// 2. Dog子类，继承Animal并实现Afraid接口
class Dog extends Animal implements Afraid {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    @Override
    public void escape() {
        System.out.println("狗害怕了，跑掉了");
    }

    @Override
    public void makeSounds() {
        System.out.println("狗害怕时发出呜呜声");
    }
}

// 2. Cat子类，继承Animal并实现Afraid接口
class Cat extends Animal implements Afraid {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void escape() {
        System.out.println("猫害怕了，窜上了树");
    }

    @Override
    public void makeSounds() {
        System.out.println("猫害怕时发出嘶嘶声");
    }
}

// 4. Person类
class Person {
    // 喂食方法，参数为Animal类型
    public void feed(Animal animal) {
        System.out.println("人在喂食...");
        animal.eat();
    }

    // 捕捉动物方法，参数为Afraid类型
    public void catchAnimal(Afraid afraid) {
        System.out.println("人在捕捉动物...");
        afraid.makeSounds();
        afraid.escape();
    }
}

// 主类
public class AnimalTest {
    public static void main(String[] args) {
        // 5. 父类引用子类实例
        Animal dog = new Dog();
        Animal cat = new Cat();

        // 调用子类的eat方法
        System.out.println("---动物进食---");
        dog.eat();
        cat.eat();

        // 使用Person类的方法
        Person person = new Person();
        System.out.println("\n---喂食过程---");
        person.feed(dog);
        person.feed(cat);

        System.out.println("\n---捕捉过程---");
        // 接口引用实现类实例
        Afraid afraidDog = new Dog();
        Afraid afraidCat = new Cat();
        person.catchAnimal(afraidDog);
        person.catchAnimal(afraidCat);
    }
}